{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Probability weighted Autoencoder\n",
    "A Probability-Weighted Autoencoder (PWAE) is a variant of the traditional autoencoder designed to incorporate probabilistic weighting into the reconstruction process. Unlike standard autoencoders that treat all inputs equally, a PWAE assigns different importance to each data point based on its probability distribution, enhancing its ability to detect anomalies and rare events. The model minimizes a weighted reconstruction loss, ensuring that more critical samples (e.g., minority class instances like fraud) contribute more to learning."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-28T08:12:28.042566Z",
     "iopub.status.busy": "2025-09-28T08:12:28.042306Z",
     "iopub.status.idle": "2025-09-28T08:12:31.217905Z",
     "shell.execute_reply": "2025-09-28T08:12:31.217193Z"
    }
   },
   "outputs": [],
   "source": [
    "from river import compose, preprocessing, metrics, datasets\n",
    "from deep_river.anomaly import ProbabilityWeightedAutoencoder\n",
    "from torch import nn, manual_seed\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Analyse\n",
    "This code initializes a reproducible environment and loads a subset of the CreditCard dataset, selecting 5000 transactions for analysis. It then converts the dataset into a Pandas DataFrame and generates a summary report using TableReport(), which provides an overview of the dataset's structure, feature distributions, and potential missing values. This step helps to understand the data before applying preprocessing or modeling techniques."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-28T08:12:31.220599Z",
     "iopub.status.busy": "2025-09-28T08:12:31.220333Z",
     "iopub.status.idle": "2025-09-28T08:12:31.224665Z",
     "shell.execute_reply": "2025-09-28T08:12:31.224066Z"
    }
   },
   "outputs": [],
   "source": [
    "_ = manual_seed(42)\n",
    "dataset = datasets.CreditCard().take(5000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Model Creation\n",
    "While the model stays the same as the fully connected autoencoder, the wrapper class changes to the probability weighted autoencoder. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-28T08:12:31.227173Z",
     "iopub.status.busy": "2025-09-28T08:12:31.226983Z",
     "iopub.status.idle": "2025-09-28T08:12:31.887177Z",
     "shell.execute_reply": "2025-09-28T08:12:31.886644Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><div class=\"river-component river-pipeline\"><details class=\"river-component river-estimator\"><summary class=\"river-summary\"><pre class=\"river-estimator-name\">MinMaxScaler</pre></summary><code class=\"river-estimator-params\">MinMaxScaler ()\n",
       "</code></details><details class=\"river-component river-estimator\"><summary class=\"river-summary\"><pre class=\"river-estimator-name\">ProbabilityWeightedAutoencoder</pre></summary><code class=\"river-estimator-params\">ProbabilityWeightedAutoencoder (\n",
       "  module=MyAutoEncoder(\n",
       "  (linear1): Linear(in_features=30, out_features=3, bias=True)\n",
       "  (nonlin): LeakyReLU(negative_slope=0.01)\n",
       "  (linear2): Linear(in_features=3, out_features=30, bias=True)\n",
       "  (sigmoid): Sigmoid()\n",
       ")\n",
       "  loss_fn=\"mse\"\n",
       "  optimizer_fn=\"sgd\"\n",
       "  lr=0.005\n",
       "  device=\"cpu\"\n",
       "  seed=42\n",
       "  skip_threshold=0.9\n",
       "  window_size=250\n",
       ")\n",
       "</code></details></div><style scoped>\n",
       ".river-estimator {\n",
       "    padding: 1em;\n",
       "    border-style: solid;\n",
       "    background: white;\n",
       "    max-width: max-content;\n",
       "}\n",
       "\n",
       ".river-pipeline {\n",
       "    display: flex;\n",
       "    flex-direction: column;\n",
       "    align-items: center;\n",
       "    background: linear-gradient(#000, #000) no-repeat center / 1.5px 100%;\n",
       "}\n",
       "\n",
       ".river-union {\n",
       "    display: flex;\n",
       "    flex-direction: row;\n",
       "    align-items: center;\n",
       "    justify-content: center;\n",
       "    padding: 1em;\n",
       "    border-style: solid;\n",
       "    background: white;\n",
       "}\n",
       "\n",
       ".river-wrapper {\n",
       "    display: flex;\n",
       "    flex-direction: column;\n",
       "    align-items: center;\n",
       "    justify-content: center;\n",
       "    padding: 1em;\n",
       "    border-style: solid;\n",
       "    background: white;\n",
       "}\n",
       "\n",
       ".river-wrapper > .river-estimator {\n",
       "    margin-top: 1em;\n",
       "}\n",
       "\n",
       "/* Vertical spacing between steps */\n",
       "\n",
       ".river-component + .river-component {\n",
       "    margin-top: 2em;\n",
       "}\n",
       "\n",
       ".river-union > .river-estimator {\n",
       "    margin-top: 0;\n",
       "}\n",
       "\n",
       ".river-union > .river-component {\n",
       "    margin-top: 0;\n",
       "}\n",
       "\n",
       ".river-union > .pipeline {\n",
       "    margin-top: 0;\n",
       "}\n",
       "\n",
       "/* Spacing within a union of estimators */\n",
       "\n",
       ".river-union > .river-component + .river-component {\n",
       "    margin-left: 1em;\n",
       "}\n",
       "\n",
       "/* Typography */\n",
       "\n",
       ".river-estimator-params {\n",
       "    display: block;\n",
       "    white-space: pre-wrap;\n",
       "    font-size: 110%;\n",
       "    margin-top: 1em;\n",
       "}\n",
       "\n",
       ".river-estimator > .river-estimator-params,\n",
       ".river-wrapper > .river-details > river-estimator-params {\n",
       "    background-color: white !important;\n",
       "}\n",
       "\n",
       ".river-wrapper > .river-details {\n",
       "    margin-bottom: 1em;\n",
       "}\n",
       "\n",
       ".river-estimator-name {\n",
       "    display: inline;\n",
       "    margin: 0;\n",
       "    font-size: 110%;\n",
       "}\n",
       "\n",
       "/* Toggle */\n",
       "\n",
       ".river-summary {\n",
       "    display: flex;\n",
       "    align-items:center;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".river-summary > div {\n",
       "    width: 100%;\n",
       "}\n",
       "</style></div>"
      ],
      "text/plain": [
       "Pipeline (\n",
       "  MinMaxScaler (),\n",
       "  ProbabilityWeightedAutoencoder (\n",
       "    module=MyAutoEncoder(\n",
       "    (linear1): Linear(in_features=30, out_features=3, bias=True)\n",
       "    (nonlin): LeakyReLU(negative_slope=0.01)\n",
       "    (linear2): Linear(in_features=3, out_features=30, bias=True)\n",
       "    (sigmoid): Sigmoid()\n",
       "  )\n",
       "    loss_fn=\"mse\"\n",
       "    optimizer_fn=\"sgd\"\n",
       "    lr=0.005\n",
       "    device=\"cpu\"\n",
       "    seed=42\n",
       "    skip_threshold=0.9\n",
       "    window_size=250\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset = datasets.CreditCard().take(5000)\n",
    "metric = metrics.RollingROCAUC(window_size=5000)\n",
    "class MyAutoEncoder(nn.Module):\n",
    "    def __init__(self, n_features, latent_dim=3):\n",
    "        super(MyAutoEncoder, self).__init__()\n",
    "        self.linear1 = nn.Linear(n_features, latent_dim)\n",
    "        self.nonlin = nn.LeakyReLU()\n",
    "        self.linear2 = nn.Linear(latent_dim, n_features)\n",
    "        self.sigmoid = nn.Sigmoid()\n",
    "\n",
    "    def forward(self, X, **kwargs):\n",
    "        X = self.linear1(X)\n",
    "        X = self.nonlin(X)\n",
    "        X = self.linear2(X)\n",
    "        return self.sigmoid(X)\n",
    "\n",
    "\n",
    "model_pipeline = compose.Pipeline(\n",
    "    preprocessing.MinMaxScaler(), \n",
    "    ProbabilityWeightedAutoencoder(module=MyAutoEncoder(30), lr=0.005)\n",
    ")\n",
    "model_pipeline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Run the Datastream\n",
    "This block performs hyperparameter optimization by evaluating the impact of different latent dimensions on the model's performance. It iterates over a predefined set of `latent_dim` values, initializing a fresh dataset and rolling ROC AUC metric for each experiment. A pipeline is created for each latent dimension, consisting of a `MinMaxScaler` for normalization and an autoencoder trained using online learning. The model is then trained and evaluated sequentially on the dataset, updating the metric with its predictions. After processing all data points, the final ROC AUC score is recorded for the current latent dimension. Once all experiments are completed, the results are stored in a DataFrame and visualized using a line plot, where the x-axis represents the latent dimension values and the y-axis represents the corresponding ROC AUC scores. This visualization helps identify the optimal latent dimension for anomaly detection."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-28T08:12:31.890169Z",
     "iopub.status.busy": "2025-09-28T08:12:31.889692Z",
     "iopub.status.idle": "2025-09-28T08:12:35.825448Z",
     "shell.execute_reply": "2025-09-28T08:12:35.824851Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ROCAUC: 0.8530\n"
     ]
    }
   ],
   "source": [
    "for x, y in dataset:\n",
    "    score = model_pipeline.score_one(x)\n",
    "    metric.update(y_true=y, y_pred=score)\n",
    "    model_pipeline.learn_one(x=x)\n",
    "print(f\"ROCAUC: {metric.get():.4f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Hyperparameter Optimization\n",
    "This block processes the dataset sequentially, evaluating and updating the model in an online learning manner. For each data point, the model generates an anomaly score using `score_one(x)`, which is then used to update the rolling ROC AUC metric by comparing it to the true label `y`. After scoring, the model is trained incrementally using `learn_one(x)`, allowing it to adapt continuously as new data arrives. Once all data points have been processed, the final ROC AUC score is printed, providing a performance measure of the model's ability to distinguish between fraudulent and non-fraudulent transactions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-28T08:12:35.828150Z",
     "iopub.status.busy": "2025-09-28T08:12:35.827949Z",
     "iopub.status.idle": "2025-09-28T08:12:35.830735Z",
     "shell.execute_reply": "2025-09-28T08:12:35.830201Z"
    }
   },
   "outputs": [],
   "source": [
    "latent_dims = [2, 5, 10, 20, 30, 40]  # You can adjust this range\n",
    "results = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-28T08:12:35.833261Z",
     "iopub.status.busy": "2025-09-28T08:12:35.833073Z",
     "iopub.status.idle": "2025-09-28T08:12:59.412443Z",
     "shell.execute_reply": "2025-09-28T08:12:59.411767Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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Lnbs2KF30YNjx44JX19fYW5urnWOvBbmmDdvnvDy8hJmZmbC3d0934U5ntehQwfRoUMHnWMLM+1aXpt6erCIiAhRt25dYWFhIerXry/Wrl2r917y+gyFECIxMVFMmjRJuLu7a56bLl26iG+++UanPs9PA6f+DNeuXaspe/r0qRgyZIiws7MTgLyFOdT3pVAohI2NjWjUqJEICgoSJ06c0Pue3J+dEDmf3/3797WOy+v/kr7vpxkZGeLTTz8VjRo1EhYWFqJq1arC19dXzJs3TyQnJ2tdW990ah4eHpq4pqeni3fffVf4+PgIa2trUblyZeHj46OzaJC+Z/TJkydi6tSponr16sLMzEzUrVs334U58qtHQVJSUjTPRO75kdU++ugj0bJlS2FnZycqVaok6tevLz7++GORkZGhOUb9fSD3M5CXvOoshBBz587VO2VlYb6vqV29elUEBQUJT09PYW5uLqytrUWbNm3El19+KZ49eyZiYmIEADFr1qw8z3Hz5k2dqUmzsrLE0qVLhY+Pj7C0tBSWlpbCx8dHfPHFF1rzqed29+5dMXXqVFGvXj1haWkprKyshK+vr/j444+1nitjpRCiBEcgkNFZunQppk6dips3b+qMOr558ya8vLywcOFCTJs2rcTrMnfuXMybNw/379/XGdlNZQc/JyIiMjT2IaZiI4RAREQEOnTooHcKHiIiIqKyiH2I6YWlpqbi119/xYEDB/DXX39pDUYgIiIiKuuYENMLu3//PoYMGQI7Ozu8//776N27t6GrRERERCQb+xATERERkVFjH2IiIiIiMmpMiImIiIjIqLEPcRFlZ2fj7t27sLa2NvhyskRERESkSwiBJ0+eoHr16jAxybsdmAlxEd29ezfPVWWIiIiIqOz4999/UaNGjTz3MyEuImtrawBSgG1sbAxcm7JHpVJh79696NatG8zMzAxdnTKNsZKHcZKHcZKHcZKHcZKHcZKvtGOVkpICd3d3Td6WFybERaTuJmFjY8OEWA+VSgUrKyvY2Njwm0MBGCt5GCd5GCd5GCd5GCd5GCf5DBWrgrq3clAdERERERk1JsREREREZNSYEBMRERGRUWNCTERERERGjQkxERERERk1JsREREREZNSYEBMRERGRUWNCTERERERGjQkxERERERk1JsRERBVEVhZw6JAChw+74dAhBbKyDF0j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+PHj8fTpU00/6dz0tRC7u7vjwYMH+Z63PHj6FKhWzRRCKHDrlgrF0YtEpVIhMjISXbt2hZmZ2YufsAJjrORhnORhnORhnORhnORhnOQr7VilpKTAwcEBycnJ+eZrBm0hdnBwgFKpRGKidotkYmJigX17U1NTsWHDBsyfP1/vfpVKhTfeeAP//PMP9u/fX2DS6u/vj8zMTNy8eRPe3t46+y0sLPQmymZmZuX+4b94URpQV7064O5evPdSEeJTWhgreRgneRgneRgneRgneRgn+UorVnKvIXvatZJgbm4OX19fREVFacqys7MRFRWl1WKsz+bNm5Genq53cJ86Gb527Rr27duHatWqFViXs2fPwsTERO/MFhUdB9QRERGRMTNoCzEAhISEYOTIkfDz80PLli2xZMkSpKamamadGDFiBNzc3BAWFqb1voiICPTt21cn2VWpVHjttddw5swZ7NixA1lZWUhISAAgzVBhbm6O6OhonDhxAp06dYK1tTWio6MxdepUDBs2DFWrVi2dGy9DmBATERGRMTN4Qjxw4EDcv38fs2fPRkJCApo1a4bdu3drBtrdunULJibaDdlXrlzB0aNHsXfvXp3z3blzB7/++isAoFmzZlr7Dhw4gI4dO8LCwgIbNmzA3LlzkZ6eDi8vL0ydOhUhISElc5NlHBNiIiIiMmYGT4gBIDg4GMHBwXr3HTx4UKfM29sbeY0F9PT0zHOfWosWLXD8+PFC17MiSk3lCnVERERk3Azah5gM7+xZIDsbcHWVNiIiIiJjw4TYyLG7BBERERk7JsRGjgkxERERGTsmxEaOCTEREREZOybERiw1Fbh0SfqaCTEREREZKybERuzcOWlAnYuLtEodERERkTFiQmzE2F2CiIiIiAmxUWNCTERERMSE2KipE2I/P8PWg4iIiMiQmBAbqbQ04O+/pa/ZQkxERETGjAmxkeKAOiIiIiIJE2Ijxf7DRERERBImxEaKCTERERGRhAmxkTp9WvqXCTEREREZOybERogD6oiIiIhyMCE2QuoBdc7OHFBHRERExITYCOXuP6xQGLYuRERERIbGhNgIcUAdERERUQ4mxEaICTERERFRDibERua//zigjoiIiCg3JsRG5tw5ICsLcHIC3NwMXRsiIiIiw2NCbGQ4oI6IiIhIGxNiI8P+w0RERETamBAbGSbERERERNqY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",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for latent_dim in latent_dims:\n",
    "    # Initialize a fresh metric\n",
    "    dataset = datasets.CreditCard().take(5000)\n",
    "    metric = metrics.RollingROCAUC(window_size=5000)\n",
    "\n",
    "    # Initialize pipeline with current latent_dim\n",
    "    model_pipeline = compose.Pipeline(\n",
    "        preprocessing.MinMaxScaler(),\n",
    "        ProbabilityWeightedAutoencoder(module=MyAutoEncoder(30, latent_dim), lr=0.005)\n",
    "    )\n",
    "\n",
    "    # Train and evaluate model\n",
    "    for x, y in dataset:\n",
    "        score = model_pipeline.score_one(x)\n",
    "        metric.update(y_true=y, y_pred=score)\n",
    "        model_pipeline.learn_one(x=x)\n",
    "\n",
    "    # Store the result\n",
    "    results.append((latent_dim, metric.get()))\n",
    "\n",
    "# Convert results to DataFrame for visualization\n",
    "df_results = pd.DataFrame(results, columns=[\"latent_dim\", \"ROCAUC\"])\n",
    "\n",
    "# Plot results\n",
    "plt.figure(figsize=(8, 5))\n",
    "plt.plot(df_results[\"latent_dim\"], df_results[\"ROCAUC\"], marker=\"o\", linestyle=\"-\", color=\"b\")\n",
    "plt.xlabel(\"Latent Dimension\")\n",
    "plt.ylabel(\"ROCAUC Score\")\n",
    "plt.title(\"Hyperparameter Optimization: Latent Dimension vs. ROCAUC\")\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "deep-river",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
